#!/usr/bin/env python3

import os
import lief

def inject_library(target_lib, gadget_lib):
    try:
        # 备份目标库文件
        backup_lib = f"{target_lib}_old"
        os.rename(target_lib, backup_lib)
        print(f"已创建备份文件: {backup_lib}")

        # 加载目标库文件
        print(f"正在加载 {backup_lib}...")
        libnative = lief.parse(backup_lib)

        if not libnative:
            print(f"错误: 无法加载 {backup_lib}.")
            return False

        # 注入 Frida Gadget 库
        print(f"正在向 {backup_lib} 注入 {gadget_lib}...")
        libnative.add_library(os.path.basename(gadget_lib))

        # 写入修改后的库
        libnative.write(target_lib)
        print(f"成功注入 {gadget_lib}，修改后的库已写入 {target_lib}.")
        return True

    except Exception as e:
        print(f"注入过程中发生错误: {e}")
        return False


if __name__ == "__main__":
    print("=== SO 文件注入工具 ===")
    try:
        # 提示用户拖入目标 SO 文件
        print("请拖入目标 SO 文件路径，并回车按键确认 (例如: libdemo.so):")
        target_lib = input("> ").strip().strip('"')

        if not os.path.exists(target_lib):
            print(f"错误: 目标库文件 {target_lib} 不存在.")
            input("按任意键退出...")
            exit(1)

        # 提示用户拖入 libfrida-gadget.so 文件
        print("请拖入frida库文件路径，并回车按键确认（例如: libfrida-gadget.so）:")
        gadget_lib = input("> ").strip().strip('"')

        if not os.path.exists(gadget_lib):
            print(f"错误: Gadget 库文件 {gadget_lib} 不存在.")
            input("按任意键退出...")
            exit(1)

        # 执行注入
        success = inject_library(target_lib, gadget_lib)
        if success:
            print(f"注入完成. 修改后的库文件是 {target_lib}, 备份文件是 {target_lib}_old.")
        else:
            print("注入失败.")

    except Exception as e:
        print(f"发生意外错误: {e}")

    input("按任意键退出...")

